package top.ltc_cn.minecraft_manager.config.Security;

// 导入必要的类和接口
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
import top.ltc_cn.minecraft_manager.properties.SecurityProperties;

// 定义安全配置类
@Configuration
@EnableWebSecurity // 启用 Spring Security 的 Web 安全支持
@Log4j2
public class SecurityConfig {

    @Autowired
    private SecurityProperties securityProperties;

    // 定义一个 Bean 来配置安全过滤器链
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        try {
            log.info("Configuring security filter chain... | 启动 CSRF - Security");
            // 根据配置决定是否启用 CSRF 保护
            if (securityProperties.getCsrf().isEnable()) {
                // TODO 待优化
                log.info("CSRF 配置为 true，启用 CSRF 保护。（无法开启呢，因为没弄好）");
//                    http.csrf(csrf -> csrf
//                            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())); // 设置 CSRF 令牌存储库
                    http
                            .csrf(csrf -> csrf
                                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())) // 设置 CSRF 令牌存储库
//                            .csrf(AbstractHttpConfigurer::disable)
                            .authorizeHttpRequests(auth -> auth
                                                           .anyRequest().permitAll()                     // 其他所有请求都不需要认证
                                                  )
                            .formLogin(AbstractHttpConfigurer::disable // 禁用默认的登录页面
                            )
                            .logout(AbstractHttpConfigurer::disable // 禁用默认的注销功能
                            )
                            .exceptionHandling(exception -> exception
                                    .authenticationEntryPoint((request, response, authException) -> {
                                        // 未认证时直接返回401，而不是重定向
                                        log.debug("未认证时直接返回401，而不是重定向");
                                        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
                                    })
                            )
                            .httpBasic(AbstractHttpConfigurer::disable);
            } else {
                log.info("CSRF 配置为 false，不启用 CSRF 保护。");
                http.csrf(AbstractHttpConfigurer::disable); // 禁用 CSRF 保护
            }

//            // 配置请求授权规则
//            http
//                    .authorizeHttpRequests(authorizeRequests -> authorizeRequests
////                            .requestMatchers("/**").permitAll() // 允许所有用户访问 / 下的资源
//                            .anyRequest().permitAll() // 其他所有请求允许访问
//                    )
//                    .formLogin(AbstractHttpConfigurer::disable // 禁用默认的登录页面
//                    )
//                    .logout(AbstractHttpConfigurer::disable // 禁用默认的注销功能
//                    )
//                    .exceptionHandling(exception -> exception
//                            .authenticationEntryPoint((request, response, authException) -> {
//                                // 未认证时直接返回401，而不是重定向
//                                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
//                            })
//                    )
//                    .httpBasic(AbstractHttpConfigurer::disable);

            return http.build(); // 构建并返回安全过滤器链
        } catch (Exception e) {
            log.error("Error configuring security filter chain", e);
            throw new RuntimeException("Error configuring security filter chain", e);
        }
    }

    // 定义一个切入点，匹配所有使用了 @SecurePost 注解的方法
    @Pointcut("@annotation(top.ltc_cn.minecraft_manager.config.Security.SecurePost)")
    public void securePostMethods() {}

    // 在匹配的方法执行前进行安全检查
    @Before("securePostMethods()")
    public void checkSecurity() {
        // 在这里实现你的安全性检查逻辑
        // 例如：检查当前用户是否有权限执行此操作、检查请求数据的有效性等

        // 如果检查失败，可以抛出异常或者采取其他措施
        // throw new SecurityException("Security check failed");
    }
}
